/**
 * @file Animation.h
 * Declaração da classe Animation.
 */

#ifndef ANIMATION_H_
#define ANIMATION_H_

#include <vector>
#include <string>
#include "Sprite.h"
#include "core/utils.h"


/**
 * Animação de um personagem.
 *
 * Essa classe é como uma sprite animada. Serve para ser usada quando um
 * personagem estiver se movendo, atacando ou fazendo alguma outra coisa que
 * exija uma animação.
 */
class Animation {

public:

	/**
	 * Constrói uma animação usando todos os arquivos presentes em um diretório.
	 *
	 * @param path O diretório onde estão as imagens que compõem a animação.
	 * @param stepDelay O tempo que demora para avançar um quadro da animação.
	 */
	Animation(const std::string& path, unsigned stepDelay, SDL_Rect* base);

	/**
	 * Libera as sprites carregadas.
	 */
	virtual ~Animation();

	/**
	 * Atualiza o quadro de animação que deve ser exibido.
	 */
	Animation& update(int dt);

	/**
	 * Renderiza esse objeto na tela.
	 */
	void render(SDL_Surface* screen);

	/**
	 * Rotaciona o objeto para o ângulo desejado.
	 */
	Animation& rotate(double angle) {
		this->angle = angle;
		return *this;
	}

	/**
	 * Retorna o retângulo com a posição desse objeto na tela.
	 */
	const SDL_Rect& getRect() const {
		return sprites[0]->getRect();
	}

	double getAngle() const {
		return angle;
	}


protected:

	/**
	 * Tempo que gasta para avançar cada quadro de animação.
	 */
	unsigned timeStep;

	/**
	 * Tempo total da animação (para passar todos os quadros, um ciclo).
	 */
	unsigned timeTotal;

	/**
	 * O instante atual que será usado para atualizar os outros tempos.
	 */
	unsigned timeNow;

	/**
	 * O índice que indica qual sprite da animação será blitada.
	 */
	unsigned index;

	/**
	 * Ângulo em que as sprites da animação devem estar.
	 */
	double angle;

	/**
	 * Sprite que compõem a animação.
	 */
	std::vector<Sprite*> sprites;

};


#endif /* ANIMATION_H_ */
